/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Berekenen;

import java.util.Iterator;
import java.util.TreeMap;
import Domain.*;
import Jama.Matrix;
/**
 *
 * @author Memet
 */
public class Calc {

    /**
     * Berekend de dikte van het laminaat
     * @param lam het laminaat
     * @return De dikte van het laminaat (m)
     */
    public static double H(Matrix lam) {
        Matrix d = lam.getMatrix(0, lam.getRowDimension() - 1, 3, 3);
        int n = lam.getRowDimension(); // aantal lamellen
        //Dikte initialiseren
        double dikte = 0;
        //Totale dikte berekenen
        for (int i = 0; i < n; i++) {
            dikte += d.get(i, 0);
        }
        double h = dikte; //dikte
        return h;
    }

    /**
     * Berekend de stijfheid in de x richting
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @return de stijfheid in de x richting [Pa]
     */
    public static double E1(Matrix lam, Data data) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data), MaakMatrix.B(lam, data), MaakMatrix.D(lam, data));
        return 1 / (a.get(0, 0) * H(lam));
        //E1=1/(a(1,1)*h) ; % Ex
    }

    /**
     * Berekend de stijfheid in de x richting
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @param grad het aantal graden
     * @return de stijfheid in de x richting [Pa]
     */
    public static double E1(Matrix lam, Data data, int grad) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data, grad), MaakMatrix.B(lam, data, grad), MaakMatrix.D(lam, data, grad));
        return 1 / (a.get(0, 0) * H(lam));
        //E1=1/(a(1,1)*h) ; % Ex
    }

    /**
     * Berekend de stijfheid in de y richting
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @return de stijfheid in de y richting [Pa]
     */
    public static double E2(Matrix lam, Data data) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data), MaakMatrix.B(lam, data), MaakMatrix.D(lam, data));
        return 1 / (a.get(1, 1) * H(lam));
        // E2=1/(a(2,2)*h) ; % Ey
    }

    /**
     * Berekend de stijfheid in de y richting
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @param grad het aantal graden
     * @return de stijfheid in de y richting [Pa]
     */
    public static double E2(Matrix lam, Data data, int grad) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data, grad), MaakMatrix.B(lam, data, grad), MaakMatrix.D(lam, data, grad));
        return 1 / (a.get(1, 1) * H(lam));
        // E2=1/(a(2,2)*h) ; % Ey
    }


    public static double E3(Matrix lam, Data data)
    {
        double e3 = 0;
        TreeMap<Materiaal, Double> mats = new TreeMap<Materiaal, Double>();
        try{
        for(int i = 0; i<lam.getRowDimension(); i++)
        {
            if(mats.containsKey(data.getMateriaal((int) lam.get(i,1))))
            {
                mats.put(data.getMateriaal((int) lam.get(i,1)),mats.get(data.getMateriaal((int) lam.get(i,1)))+lam.get(i, 3));
            }
            else
            {
                
                mats.put(data.getMateriaal((int) lam.get(i,1)),lam.get(i, 3));
            }
        }
        double h = H(lam); //*10
        //Matrix m = m.
        

        Iterator<Materiaal> it = mats.keySet().iterator();
        while(it.hasNext())
        {
            double et = 0;
            Materiaal mat = it.next();
            try
            {
                //AHMET: Hele inhoud van deze try statement gecomment
                
                //Lamel ud = (Lamel) mat;
                //if(ud.getMethode().equals(EtBerekeningsMethode.Halpin_Tsaj))
                //{
                //    et = Tclaml.EtHT(ud.getVf(), ud.getV().getE(), ud.getM().getE());
                //}
                //else
                //{
                //    et = Tclaml.EtHTH(ud.getVf(), ud.getM().getMu(), ud.getV().getE(), ud.getM().getE(), ud.getV().getMu());
                //}
            }
            catch(Exception ex)
            {
                et = mat.getEt();
            }
            e3+= et * (mats.get(mat)/(h));///100; //h*1e3
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally{
        return e3;}
    }


    /**
     * Berekend de glijdingsmodulus van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @return de glijdingsmodulus van het laminaat [Pa]
     */
    public static double G12(Matrix lam, Data data) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data), MaakMatrix.B(lam, data), MaakMatrix.D(lam, data));
        return 1 / (a.get(2, 2) * H(lam));
        //    G12=1/(a(3,3)*h) ; % Gxy
    }

    /**
     * Berekend de glijdingsmodulus van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @param grad het aantal graden
     * @return de glijdingsmodulus van het laminaat [Pa]
     */
    public static double G12(Matrix lam, Data data, int grad) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data, grad), MaakMatrix.B(lam, data, grad), MaakMatrix.D(lam, data, grad));
        return 1 / (a.get(2, 2) * H(lam));
        //    G12=1/(a(3,3)*h) ; % Gxy
    }

    /**
     * Berekend de xy-Poissonverhouding van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @return de xy-Poissonverhouding van het laminaat
     */
    public static double Mu12(Matrix lam, Data data) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data), MaakMatrix.B(lam, data), MaakMatrix.D(lam, data));
        return -(a.get(1, 0)) / a.get(0, 0);
        //    Mu12=-a(2,1)/a(1,1); % Muxy
    }

     /**
     * Berekend de xy-Poissonverhouding van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
      * @param grad het aantal graden
      * @return de xy-Poissonverhouding van het laminaat
     */
    public static double Mu12(Matrix lam, Data data, int grad) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data, grad), MaakMatrix.B(lam, data, grad), MaakMatrix.D(lam, data, grad));
        return -(a.get(1, 0)) / a.get(0, 0);
        //    Mu12=-a(2,1)/a(1,1); % Muxy
    }

    /**
     * Berekend de yx-Poissonverhouding van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @return de yx-Poissonverhouding van het laminaat
     */
    public static double Mu21(Matrix lam, Data data) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data), MaakMatrix.B(lam, data), MaakMatrix.D(lam, data));
        return -(a.get(1, 0)) / a.get(1, 1);
        //    Mu21=-a(2,1)/a(2,2); % Muyx
    }

    /**
     * Berekend de yx-Poissonverhouding van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @param grad het aantal graden
     * @return de yx-Poissonverhouding van het laminaat
     */
    public static double Mu21(Matrix lam, Data data, int grad) {
        Matrix a = MaakMatrix.CompliantieA(MaakMatrix.A(lam, data, grad), MaakMatrix.B(lam, data, grad), MaakMatrix.D(lam, data, grad));
        return -(a.get(1, 0)) / a.get(1, 1);
        //    Mu21=-a(2,1)/a(2,2); % Muyx
    }

    /**
     * Berekend de dichtheid van het laminaat
     * @param lam Het lamel
     * @param data De databank met alle materialen
     * @return De dichtheid van het laminaat [Km/m3]
     */
    public static double Rho(Matrix lam, Data data) {
        Matrix m = lam.getMatrix(0, lam.getRowDimension() - 1, 1, 1); // materiaal lamel
        int n = lam.getRowDimension(); // aantal lamellen
        double rhotot = 0;
        for (int j = 0; j < n; j++) {
            int mat = (int) m.get(j, 0); //materiaalnummer
            Materiaal materiaal = data.getMateriaal(mat);
            
            rhotot += materiaal.getRhol() * (lam.get(j, 3)/H(lam));
        }
        return rhotot; // /= H(lam);

    }

    /**
     * Methode om af te ronden
     * @param Rval De waarde die afgerond moet worden
     * @param Rpl Het aantal decimalen
     * @return De afgeronde waarde
     */
    public static double Round(double Rval, int Rpl) {
        double p = (double) Math.pow(10, Rpl);
        Rval = Rval * p;
        double tmp = Math.round(Rval);
        return (double) tmp / p;
    }

    public static double G23(Matrix lam, Data data) {
        double g23 = 0;
        TreeMap<Materiaal, Double> mats = new TreeMap<Materiaal, Double>();
        try{
        for(int i = 0; i<lam.getRowDimension(); i++)
        {
            if(mats.containsKey(data.getMateriaal((int) lam.get(i,1))))
            {
                mats.put(data.getMateriaal((int) lam.get(i,1)),mats.get(data.getMateriaal((int) lam.get(i,1)))+lam.get(i, 3));
            }
            else
            {

                mats.put(data.getMateriaal((int) lam.get(i,1)),lam.get(i, 3));
            }
        }
        double h = H(lam); //*10
        //Matrix m = m.


        Iterator<Materiaal> it = mats.keySet().iterator();
        while(it.hasNext())
        {
            double glt = 0;
            Materiaal mat = it.next();
            try
            {
                //AHMET: 2 regels hieronder gecomment
                //Lamel ud = (Lamel) mat;

                //glt = Tclaml.Glt(ud.getV().getE(), ud.getM().getE(), ud.getV().getMu(), ud.getM().getMu(), ud.getVf());

            }
            catch(Exception ex)
            {
                glt = mat.getGlt();
            }
            g23+= glt * (mats.get(mat)/(h));///100; //h*1e3
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally{
        return g23;}
    }

    public static double G31(Matrix lam, Data data) {
        double g31 = 0;
        TreeMap<Materiaal, Double> mats = new TreeMap<Materiaal, Double>();
        try{
        for(int i = 0; i<lam.getRowDimension(); i++)
        {
            if(mats.containsKey(data.getMateriaal((int) lam.get(i,1))))
            {
                mats.put(data.getMateriaal((int) lam.get(i,1)),mats.get(data.getMateriaal((int) lam.get(i,1)))+lam.get(i, 3));
            }
            else
            {

                mats.put(data.getMateriaal((int) lam.get(i,1)),lam.get(i, 3));
            }
        }
        double h = H(lam); //*10
        //Matrix m = m.


        Iterator<Materiaal> it = mats.keySet().iterator();
        while(it.hasNext())
        {
            double glt = 0;
            Materiaal mat = it.next();
            try
            {
                //AHMET: 2 regels gecomment:
                
                //Lamel ud = (Lamel) mat;

                //glt = Tclaml.Glt(ud.getV().getE(), ud.getM().getE(), ud.getV().getMu(), ud.getM().getMu(), ud.getVf());

            }
            catch(Exception ex)
            {
                glt = mat.getGlt();
            }
            g31+= glt * (mats.get(mat)/(h));///100; //h*1e3
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally{
        return g31;}
    }

    public static double Nu23(Matrix lam, Data data) {
        double Nu23 = 0;
        TreeMap<Materiaal, Double> mats = new TreeMap<Materiaal, Double>();
        try{
        for(int i = 0; i<lam.getRowDimension(); i++)
        {
            if(mats.containsKey(data.getMateriaal((int) lam.get(i,1))))
            {
                mats.put(data.getMateriaal((int) lam.get(i,1)),mats.get(data.getMateriaal((int) lam.get(i,1)))+lam.get(i, 3));
            }
            else
            {

                mats.put(data.getMateriaal((int) lam.get(i,1)),lam.get(i, 3));
            }
        }
        double h = H(lam); //*10
        //Matrix m = m.


        Iterator<Materiaal> it = mats.keySet().iterator();
        while(it.hasNext())
        {
            double Nult = 0;
            Materiaal mat = it.next();
            try
            {
                //AHMET: 2 regels gecomment:
                
                //Lamel ud = (Lamel) mat;

                //Nult = Tclaml.Mult(ud.getV().getMu(), ud.getM().getMu(), ud.getVf());

            }
            catch(Exception ex)
            {
                Nult = mat.getMult();
            }
            Nu23+= Nult * (mats.get(mat)/(h));///100; //h*1e3
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally{
        return Nu23;}
    }

    public static double Nu31(Matrix lam, Data data) {
        double Nu31 = 0;
        TreeMap<Materiaal, Double> mats = new TreeMap<Materiaal, Double>();
        try{
        for(int i = 0; i<lam.getRowDimension(); i++)
        {
            if(mats.containsKey(data.getMateriaal((int) lam.get(i,1))))
            {
                mats.put(data.getMateriaal((int) lam.get(i,1)),mats.get(data.getMateriaal((int) lam.get(i,1)))+lam.get(i, 3));
            }
            else
            {

                mats.put(data.getMateriaal((int) lam.get(i,1)),lam.get(i, 3));
            }
        }
        double h = H(lam); //*10
        //Matrix m = m.


        Iterator<Materiaal> it = mats.keySet().iterator();
        while(it.hasNext())
        {
            double Nult = 0;
            Materiaal mat = it.next();
            try
            {
                //AHMET: 2 regels gecomment:
                
                //Lamel ud = (Lamel) mat;

                //Nult = Tclaml.Mult(ud.getV().getMu(), ud.getM().getMu(), ud.getVf());

            }
            catch(Exception ex)
            {
                Nult = mat.getMult();
            }
            Nu31+= Nult * (mats.get(mat)/(h));///100; //h*1e3
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally{
        return Nu31;}
    }

    public static double A1(Matrix lam, Data data)
    {
        Matrix nt = MaakMatrix.Nt(lam, data);
        Matrix mt = MaakMatrix.Mt(lam, data);
        Matrix nm = MaakMatrix.NMmat(nt, mt);
        Matrix a = MaakMatrix.A(lam, data);
        Matrix b = MaakMatrix.B(lam, data);
        Matrix d = MaakMatrix.D(lam, data);
        Matrix ek = MaakMatrix.EKMat(nm, a, b, d);
        return ek.get(0, 0);
    }

    public static double A2(Matrix lam, Data data)
    {
        Matrix nt = MaakMatrix.Nt(lam, data);
        Matrix mt = MaakMatrix.Mt(lam, data);
        Matrix nm = MaakMatrix.NMmat(nt, mt);
        Matrix a = MaakMatrix.A(lam, data);
        Matrix b = MaakMatrix.B(lam, data);
        Matrix d = MaakMatrix.D(lam, data);
        Matrix ek = MaakMatrix.EKMat(nm, a, b, d);
        return ek.get(1, 0);
    }

    public static double A3(Matrix lam, Data data)
    {
        double a3 = 0;
        TreeMap<Materiaal, Double> mats = new TreeMap<Materiaal, Double>();
        try{
        for(int i = 0; i<lam.getRowDimension(); i++)
        {
            if(mats.containsKey(data.getMateriaal((int) lam.get(i,1))))
            {
                mats.put(data.getMateriaal((int) lam.get(i,1)),mats.get(data.getMateriaal((int) lam.get(i,1)))+lam.get(i, 3));
            }
            else
            {

                mats.put(data.getMateriaal((int) lam.get(i,1)),lam.get(i, 3));
            }
        }
        double h = H(lam); //*10
        //Matrix m = m.


        Iterator<Materiaal> it = mats.keySet().iterator();
        while(it.hasNext())
        {
            double a2 = 0;
            Materiaal mat = it.next();
            try
            {
                //AHMET: 2 regels gecomment:
                
                //Lamel ud = (Lamel) mat;

                //a2 = ud.getA2();

            }
            catch(Exception ex)
            {
                a2 = mat.getA2();
            }
            a3+= a2 * (mats.get(mat)/(h));///100; //h*1e3
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally{
        return a3;}
    }
}
